Dijkstra+DFS模板总结

本文总结了Dijkstra算法与DFS的结合使用,介绍了如何在Dijkstra中记录多条最短路径,并通过DFS根据其他标尺选择最优路径。内容包括Dijkstra的基本运用、边权与点权的处理,以及最短路径条数的计算。同时,讨论了Dijkstra与DFS组合解题的优势,强调了关注点分离的思想。
摘要由CSDN通过智能技术生成

关于Dijstra的初级运用是,在第一标尺的基础上有下面三个角度:

  • 边权:c[maxn] = {maxn}, cost[manx][maxn] = {inf};
  • 点权:w[maxn] = {0}, weight[maxn] = {0};
  • 最短路径条数:num[maxn] = {0};

a1003.cpp 用到了其中的两个,作为模板来刻意练习,练习如何将问题结构化,模板化。

再额外补充边权的代码,不是这道题的,但是加进来使其完整。

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

const int maxv = 510; // 最大顶点数
const int inf = 1 << 30;

int G[maxv][maxv], weight[maxv],cost[maxv][maxv]; // 定义图的邻接矩阵存法,点权
int d[maxv] = {inf} ; //记录从起点s到u的最短距离,
int n,m,st,ed; // n:顶点数,m:边数
int w[maxv],num[maxv]c[manv]; // w:记录最大点权之和,num:最短路径条数
bool vis[maxv] = {
  false}; // 标记是否已经访问

// 最朴素的迪杰斯塔拉就是为了找到最短路径,最终效果是更新了d数组,
// 但是在产生d数组的过程中,有意思的事情正在发生

void Dijkstra(int s) 
{
    // 初始化
    fill(d,d + maxv, inf); // 
    fill(num,num + maxv, 0);
    fill(w,w + maxv, 0);
    d[s] = 0;
    w[s] = weight[s]; 
    num[s] = 1; 

    // 循环n次
    for(int i = 0; i < n; i++)
    {
        // 找到u和最小值
        int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值